<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
3APA3A 3proxy tiny proxy server Frequently Asked Questions (FAQ)
<ul>
  <li><a href="#TROUBLE">Почему не работает...</a></li>
  <ul>
    <li><a href="#NOTHING">Q: Почему ничего не работает?</a></li>
    <li><a href="#LIMITS">Q: Почему не работают ограничения доступа (перенаправления, ограничения по скорости, трафику и т.д.)?</a></li>
    <li><a href="#SERVICE">Q: Почему 3proxy не запускается как служба?</a></li>
    <li><a href="#INTEXT">Q: Почему не получается указать internal и external?</a></li>
    <li><a href="#ODBC">Q: Почему не работает ведение журналов в ODBC?</a></li>
    <li><a href="#IPV6">Q: Почему не работает IPv6?</a></li>
    <li><a href="#CHAP">Q: Почему не поддерживаются APOP и CRAM-MD5 в POP3 прокси?</a></li>
    <li><a href="#CRASH">Q: Почему прокси крэшится при обработке запроса?</a></li>
  </ul>
  <li><a href="#SOCKSREDIR">Перенаправление socks соединений в локальный прокси</a></li>
  <ul>
    <li><a href="#REDIR">Q: Для чего это надо?</a></li>
    <li><a href="#REDIRLIMIT">Q: Какие недостатки?</a></li>
    <li><a href="#REDIRADV">Q: Какие преимущества?</a></li>
    <li><a href="#REDIRHOW">Q: Как настраивается?</a></li>
    <li><a href="#REDIINTER">Q: Как взаимодействует с другими правилами в ACL?</a></li>
  </ul>
  <li><a href="#ISIT">А есть ли...</a></li>
  <ul>
    <li><a href="#NAMES">Можно ли разрешать имена на родительском прокси?</a></li>
    <li><a href="#ISFTP">Существует ли сейчас поддержка FTP прокси в продукте?</a></li>
    <li><a href="#PORT">Каким образом можно прибиндить сервисы на свой порт, к примеру, HTTP прокси к 8080, а не 3128 как по-умолчанию?</a></li>
    <li><a href="#BANDLIM">Как ограничить ширину канала?</a></li>
  </ul>
  <li><a href="#BRRR">Почему так криво...</a></li>
  <ul>
    <li><a href="#TRAF">Почему так криво считается трафик? Не совпадает с ...</a></li>
    <li><a href="#CONFIG">Почему такая кривая конфигурация и ничерта не понятно?</a></li>
    <li><a href="#CODE">Почему так криво написан код?</a>
    <li><a href="#UNSAFE">Почему так много strcpy, sprintf и т.д., это ж дыры!</a>
  </ul>
</ul>
<hr>
<li><b><a name="TROUBLE">Почему не работает...<a></b></li>
<ul>
  <li><a name="NOTHING"><i>Q: Почему ничего не работает?</i></a></li>
  <p>
  <i>A:</i> Потому что для работы нужен правильный файл конфигурации.
  </p>
  <li><a name="LIMITS"><i>Q: Почему не работают ограничения доступа (перенаправления, ограничения по скорости,
  трафику и т.д.)?</i></a></li>
  <p>
  <i>A:</i> Обычные ошибки - использование auth none (для работы любых
  функций, основанных на ACL, требуется auth iponly, nbname или strong),
  нарушение порядка ввода команд (команды выполняются последовательно,
  запуск сервиса proxy, socks, tcppm и т.д. должен осуществляться после
  того, как указана его конфигурация), неправильный порядок записей в ACL
  (записи просматриваются последовательно до первой, удовлетворяющей
  критериям). Если в ACL имеется хотя бы одна запись, то считается, что
  последняя запись в ACL - это неявная deny *.
  </p>
  <li><a name="SERVICE"><i>Q: Почему 3proxy не запускается как служба?</i></a></li>
  <p>
  <i>A:</i> Наиболее вероятные причины:
  <ul>
    <li>Использование относительных (неполных) путей файлов в файле конфигурации
    При использовании файлов журналов, файлов вставок ($filename) используйте
    полные пути, например, $"c:\3proxy\include files\networks.local". Тоже самое
    относится к файлам журналов и любым другим.
    Для отладки лучше запускать 3proxy с ведением журнала на стандартный вывод.
    Не забудьте в таком случае отключить daemon и service в файле конфигурации.
    Для чистоты эксперимента запускать 3proxy из коммандной строки в таком случае
    следует, находясь в другой папке.
    <li>Отсутствие у системной записи прав на доступ к исполняемому файлу, каким-либо файлам конфигурации, журнала и т.п.
    <li>Отсутствие файла конфигурации по стандартному расположению -
    3proxy.cfg в одном каталоге с исполняемым файлом. Если файл расположен по
    другому пути, необходимо использовать команду
    <pre>
    3proxy --install path_to_configuration_file</pre>
    <li>Отсутствие у пользователя прав на установку или запуск службы
    <li>Служба уже установлена или запущена
  </ul>
  </p>
  <li><a name="INTEXT"><i>Q: Почему не получается указать internal и external?</i></a></li></li>
  <p>
  <i>A:</i> Убедитесь, что выправильно понимаете что такое internal и external адреса.
  Оба адреса - это адреса, принадлежищие хосту, на котором установлен 3proxy.
  Эта опция конфигурации необходима в классической ситуации, когда 3proxy
  установлен на граничном компьютере с двумя (или более) подключениями:
  <pre>
       LAN connection +-------------+ Internet connection
  LAN <-------------->| 3proxy host |<-------------------> INTERNET
                     ^+-------------+^
                     |               |
               Internal IP      External IP</pre>
  Если 3proxy работает на хосте с одним интерфейсом, то его адрес будет и
  internal и external.
  <br>Интерфейс с адресом internal должен существовать и быть рабочим на момент
  запуска 3proxy, и не должен отключаться. Если internal интерфейс
  периодически отключается, то не следует его указывать, или можно указать адрес
  0.0.0.0. При этом прокси будет принимать запросы на всех интерфейсах, поэтому
  при наличии нескольких интерфейсов для ограничения доступа следует использовать
  фаервол или хотя бы ACL.
  </p>
  <p>
  Интерфейс с адресом external, если он указан, должен быть рабочим на момент
  получения запроса клиента. При отсутствии external или адресе 0.0.0.0 внешний
  адрес будет выбираться системой при установке соединения. При этом, может быть
  возможность доступа через прокси к ресурсам локальной сети, поэтому для
  предотвращения несанкционированного доступа следует использовать ACL. Кроме
  того, могут быть проблемы с приемом входящих соединений через SOCKSv5
  (SOCKSv5 используется в клиентах исключительно редко).
  В случае, если адрес динамический, можно либо не
  указывать external, либо использовать адрес 0.0.0.0, либо, если необходима
  поддержка входящих соединений в SOCKSv5, использовать скрипт,
  который будет получать текущий адрес и сохранять его в файл, который будет
  отслуживаться через команду monitor.
  </p>
  <li><a name="ODBC"><i>Q: Почему не работает ведение журналов в ODBC?</i></a></li>
  <p>
  <i>A:</i> Убедитесь, что используется системный, а не
  пользовательский DSN. Убедитесь, что выполняется правильный SQL запрос. Наиболее
  распространенная проблема связана с отсутствием кавычек или неправильным
  форматом данных. Самый простой способ - сделать ведение журнала в файл или
  на стандартный вывод, просмотреть выдаваемые SQL запросы и попробовать
  дать такой запрос вручную.
  </p> 
  <li><a name="IPv6"><i>Q: Почему не работает IPv6?</i></a></li>
  <p>
  <i>A:</i> Прокси не может обращаться напрямую к IPv6 сети если в запросе от клиента
  указан IPv4. В запросе от клиента должен быть IPv6 адрес или имя хоста, чаще
  всего это решается включением опции разрешения имен через прокси-сервер на стороне
  клиента.
  </p> 
  <li><a name="CHAP"><i>Q: Почему не поддерживаются APOP и CRAM-MD5 в POP3 прокси?</i></a></li>
  <p>
  <i>A:</i> Любая challenge-response аутентификация, к которым относятся APOP
  и CRAM-MD5, требует, чтобы со стороны сервера был передан уникальный challenge.
  До начала аутентификации POP3 прокси не знает, к какому серверу следует
  подключаться для получения Challenge, поэтому challenge-response в принципе
  невозможен. Защитить соединение можно с помощью TLS (например, stunnel) или
  IPSec.
  </p>
  <li><a name="CRASH"><i>Q: Почему прокси крэшится при обработке запроса?</a></i></li>
  <p>
  <i>A:</i> Возможно, недостаточен размер стека потока по-умолчанию, это может
  быть при использовани каких-либо сторонних плагинов (PAM, ODBC) или на
  некоторых платформах (некоторые версии FreeBSD на amd64). Можно решить
  проблему с помощью опции 'stacksize' или '-S', поддерживаемых в 0.8.4 и выше.
  </p>
</ul>
<hr>
<li><b><a name="SOCKSREDIR">Перенаправление socks соединений в локальный прокси</a></b></li>
<ul>
  <li><a name="REDIR"><i>Q: Для чего это надо?</i></a></li>
  <p>
  <i>A:</i> Чтобы иметь в логах URL запросов, если пользователь SOCKS пользуется
  Web, FTP или POP3.
  </p>
  <li><a name="REDIRLIMIT"><i>Q: Какие недостатки?</i></a></li>
  <p>
  <i>A:</i> Перенапраление невозможно для web-серверов или FTP, висящих на
  нестандартных портах, для SOCKSv4 не поддрживается авторизация с
  паролем (IE поддерживает только SOCKSv4), но при этом IE передает
  имя пользователя по SOCKSv4 (имя, с которым пользователь вошел в систему).
  Для SOCKSv5 не поддерживается NTLM авторизация, пароли передаются в открытом
  тексте.
  </p>
  <li><a name="REDIRADV"><i>Q: Какие преимущества?</i></a></li>
  <p>
  <i>A:</i> Достаточно в настройках IE только указать адрес SOCKS прокси. В
  больших сетях можно для этого использовать WPAD (автоматическое
  обнаружение прокси). В 3proxy достаточно запускать только одну службу
  (socks). Если используется только Internet Explorer, то можно
  автоматически получать имя пользователя в логах, не запрашивая
  логин/пароль.
  </p>
  <li><a name="REDIRHOW"><i>Q: Как настраивается?</i></a></li>
  <p>
  <i>A:</i> Указывается parent http proxy со специальным адресом 0.0.0.0 и портом
  0. Пример:
  <pre>
  allow * * * 80,8080-8088
  parent 1000 http 0.0.0.0 0
  allow * * * 80,8080-8088
  #перенаправить соединения по портам 80 и 8080-8088 в локальный
  #http прокси. Вторая команда allow необходима, т.к. контроль доступа
  #осуществляется 2 раза - на уровне socks и на уровне HTTP прокси
  allow * * * 21,2121
  parent 1000 ftp 0.0.0.0 0
  allow * * * 21,2121
  #перенаправить соединения по портам 21 и 2121 в локальный
  #ftp прокси
  allow *
  #пустить все соединения напрямую
  socks</pre>
  </p>
  <li><a name="REDIINTER"><i>Q: Как взаимодействует с другими правилами в ACL?</i></a></li>
  <p>
  <i>A:</i> После внутреннего перенаправления правила рассматриваются еще раз за
  исключением самого правила с перенаправлением (т.е. обработка правил не
  прекращается). Это позволяет сделать дальнейшие перенаправления на
  внешний прокси. По этой же причине локальное перенаправление не должно
  быть последним правилом (т.е. должно быть еще хотя бы правило allow,
  чтобы разрешить внешние соединения через HTTP прокси).
  Например,
  <pre>
  allow * * * 80,8080-8088
  parent 1000 http 0.0.0.0 0
  #перенаправить во внутренний прокси
  allow * * $c:\3proxy\local.nets 80,8080-8088
  #разрешить прямой web-доступ к сетям из local.nets
  allow * * * 80,8080-8088
  parent 1000 http proxy.3proxy.ru 3128
  #все остальные веб-запросы перенаправить на внешний прокси-сервер
  allow *
  #разрешить socks-запросы по другим портам</pre>
  </p>
</ul>
<hr>
<li><b><a name="ISIT">А есть ли...</a></b></li>
<ul>
  <li><a name="NAMES"><i>Q: Можно ли разрешать имена на родительском прокси?</i></a></li>
  <p>
  <i>A:</i> Можно. Для этого надо использовать тип родительского прокси http,
  connect+, socks4+ и socks5+. Однако, при это надо помнить, что самому 3proxy
  требуется разрешение имени для управления ACL. Поэтому, если с прокси-хоста
  не работают разрешения имени, необходимо в конфигурации дать команду
  <pre>
  fakeresolve</pre>
  которая разрешает любое имя в адрес 127.0.0.2.
  </p>
  <li><a name="ISFTP"><i>Q: Существует ли сейчас поддержка FTP прокси в продукте?</i></a></li>
  <p>
  Есть поддержка как FTP через HTTP (то, что называется FTP прокси в Internet
  Explorer, Netscape, Opera) так и настоящего FTP прокси (то, что называется
  FTP proxy в FAR и FTP клиентах).
  </p>
  <li><a name="PORT"><i>Q: Каким образом можно прибиндить сервисы на свой порт, к примеру, HTTP прокси к 8080, а не 3128 как по-умолчанию?</i></a></li>
  <p>
  А:
  <pre>
  proxy -p8080</pre>
  </p>
  <li><a name="BANDLIM"><i>Q: Как ограничить ширину канала?</i></a></li>
  <p>
  <i>A:</i> Читайте HowTo <a href="https://3proxy.ru/howtor.asp#BANDLIM">https://3proxy.ru/howtor.asp#BANDLIM</a>
  </p>
</ul>
<hr>
<li><b><a name="BRRR">Почему так криво...</a></b></li>
<ul>
  <li><a name="TRAF"><i>Q: Почему так криво считается трафик? Не совпадает с ...</i></a></li>
  <p>
  <i>A:</i> Следует учитывать, что 3proxy считает трафик только на прикладном уровне и
  только проходящий через прокси-сервер. Провайдеры и другие средства учета
  трафика считают трафик на сетевом уровне, что уже дает расхождение порядка 10%
  за счет информации из заголовков пакетов. Кроме того, часть трафика, как
  минимум DNS-разрешения, различный флудовый трафик и т.д. идут мимо прокси.
  Уровень "шумового" трафика в Internet сейчас составляет порядка 50KB/день на
  каждый реальный IP адрес, но может сильно варьироваться в зависимости от сети,
  наличия открытых портов, реакции на ping-запросы и текущего уровня вирусной
  активности. По этим причинам, если 3proxy используется чтобы не "выжрать"
  трафик, выделенный провайдером, всегда следует делать некий запас порядка
  15%.
  </p>
  <p>
  Если на одной с 3proxy машине имеются какие-либо сервисы или
  работает пользователь, то их трафик не проходит через proxy-сервер и так же
  не будет учтен. Если где-то есть NAT, то клиенты, выходящие через NAT мимо
  прокси, так же останутся неучтенными. Если расхождение с провайдером превышает
  10% - нужно искать причину именно в этом.
  </p>
  <li><a name="CONFIG"><i>Q: Почему такая кривая конфигурация и ничерта не понятно?</i></a></li>
  <p>
  <i>A:</i> Есть несколько причин. Во-первых, до выхода релиза (т.е. версии 1.0) я буду изо
  всех сил добиваться совместимости конфигурации между версиями. Во-вторых,
  конфигурация сделана так, чтобы ее можно было легко разбирать программно.
  В-третьих, все там понятно. При желании. Если знать как все работает.
  </p>
  <li><a name="CODE"><i>Q: Почему так криво написан код?</i></a></li>
  <p>
  <i>A:</i> Есть несколько причин. Во-первых, я не программист. Во-вторых, 3proxy изначально
  писался на коленке (в отет на &quot;слабо&quot; в одной из конференций). Никто
  не мог предположить, что им кто-то реально будет пользоваться. В-третьих, у многих
  возникает желание разобраться в коде 3proxy чтобы внедрить его в какой-нибудь
  троян. Очень не хочется облегчать эту задачу. В-четвертых, мне надо добиться
  компиляции кода в как можно большем числе систем. Замечено, что чем кривее код в
  C, тем он лучше переносится.
  </p>
  <li><a name="UNSAFE"><i>Q: Почему так много strcpy, sprintf и т.д., это ж дыры!</i></a><li>
  <p>
  <i>A:</i> Есть несколько причин. Во-первых, несмотря на дурной тон использования этих
  функций, они наиболее совместимы между разными системами и компиляторами.
  Во-вторых, само по себе их использование не означает присутствие дыры, если их
  параметры должным образом контролируются. Найдете дыру - обязательно сообщите.
  В третьих, может быть я уберу их перед конечным релизом, чтобы никого не
  пугать.
  </p>
</ul>
